4.4 map

大部分的编程语言都有map这样的数据类型,只是在叫法上有所差异。

Go语言中,map在实际应用中也是使用比较多的一种数据类型,主要可以用于去重、快速查找等场景。

本节代码存放目录为 lesson9

什么是map?

map可以叫做集合,也可以更直观的叫做键值对存储,或者可以参照其他语言叫做字典。

map很直观的理解就是,它是可以存储两个值,一个叫做键key,一个叫做数值value,通过键key我们可以获取到实际的值value

map的存储结构如下所示:

A: 1
B: 2
C: 3
D: 4

从上面的表示我们可以看出,map存储的就是两个值,Akey1是value,所以我们通过A来获取,就可以知道它的实际值为1

map与我们日常生活中使用的字典其实是很相近的,就是通过一个目录可以找到它实际对应的章节,而且这些目录是不会重复的。

map声明及初始化

map的声明方式有三种,一种是使用varmake配合,一种是使用make直接创建,另外一种是使用map在声明是赋值实现初始化。如下所示:

var a map[string]int
a = make(map[string]int)

在上面的代码中,我们首先使用var声明了一个map的变量,之后通过make对这个变量进行了初始化。

需要注意的是,如果使用这种方式,那么必须要使用make进行初始化,否则在运行的时候是会报错的。

同时我们也可以指定长度,如果不指定的话,map会自动扩容。如下所示,我们在make时指定了map长度为10

var a map[string]int
a = make(map[string]int, 10)

我们也可以直接使用makemap进行声明同时进行初始化。如下所示:

var b = make(map[string]int)

// 简写
b := make(map[string]int)

在上面的代码中,我们通过make创建了一个map,这样的方式是比较简洁的。

还有一种方式就是我们在声明的时候就为map赋值,那么这样就可以自动完成了初始化。如下所示:

var c = map[string]int{
    "A": 1,
}

map中,key可以是基本数据类型,例如:int、int32、int64、float32、string、bool等,但是不能为:数组、切片、结构体、接口、map

总之就是,mapkey必须是可以比较的,否则都是不符合规则的。

value则可以是任何类型的,包括:基本数据类型、复合数据类型、函数等。

map的操作

map的操作主要包含添加、删除、获取、遍历等操作。

添加数据比较简单,map声明后直接赋值即可。如下所示:

a["A"] = 1

在上面的代码中,添加了一个keyAvalue1的键值对。

元素的删除我们可以使用delete方法。如下所示:

delete(a, "A")

获取值也比较简单,如下所示:

fmt.Println(a["A"])

在获取值的时候,我们还有另一种方式,如下所示:

ok, value := a["A"]
fmt.Println(ok)
fmt.Println(value)

在上面的代码中,我们使用okvalue两个值来获取接收结果。

其中ok表示在map中是否有keyA的值,如果有的话ok等于true,否则为false

value表示实际获取到的值,同时如果不存在的话,那么value就是map值类型的默认值。

比如这里的map类型是map[string]int,那么value的默认值就是0

如果是这样map[int]string,此时value的类型为string,那么默认值就是空字符串。

对于map的遍历就比较简单,与之前我们讲到的数组、切片是差不多的,只不过不同的是map只能使用for range进行遍历。如下所示:

var c = map[string]int{
    "A": 1,
    "B": 2,
}
for key, value := range c {
    fmt.Printf("key-> %s, value-> %d\n", key, value)
}

需要注意的是,map是无序的,也就是说,使用for range遍历时,你会发现每次的输出结果都是不一样的。

结果输出如下:

key-> B, value-> 2
key-> A, value-> 1

小结

map是一种常用的数据类型,通过map可以快捷的进行一些数据操作。针对本节总结如下:

  • 可以通过varmake结合进行声明及初始化

  • 可以通过make同时完成声明及初始化

  • map可以通过var直接进行声明并赋值

  • key是不能重复的

  • key必须是可以相比较的

  • value可以是任意类型的值

  • 可以通过delete删除键值对

  • 存储的key是无序的

  • 可以通过for range进行遍历

results matching ""

    No results matching ""